//package com.sztz.utils;
//
//import com.sztz.constants.CommonConstants;
//import com.sztz.entity.SecurityUser;
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.SignatureAlgorithm;
//import org.springframework.security.core.userdetails.UserDetails;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * JwtToken处理工具类
// * @author yzy
// * @date 2023/4/11 17:26
// */
//public class JwtTokenUtils {
//    static final String CLAIM_KEY_USERNAME = "sub";
//    static final String CLAIM_KEY_AUDIENCE = "audience";
//    static final String CLAIM_KEY_CREATED = "created";
//
//    private static final String AUDIENCE_MOBILE = "mobile";
//    private static final String AUDIENCE_TABLET = "tablet";
//
//    /***
//     * 根据登录账号生成JwtToken
//     * @param username
//     * @return java.lang.String
//     * @author yzy
//     * @date 2023/4/11 17:27
//     */
//    public static String generateToken(String username) {
//        Map<String, Object> claims = new HashMap<>();
//        claims.put(CLAIM_KEY_USERNAME, username);
//        claims.put(CLAIM_KEY_CREATED, new Date());
//        return generateToken(claims);
//    }
//
//    /***
//     * 使用Token获取用户账户信息
//     * @param token
//     * @return java.lang.String
//     * @author yzy
//     * @date 2023/4/11 18:00
//     */
//    public static String getUsernameFromToken(String token) {
//        String username;
//        try {
//            final Claims claims = getClaimsFromToken(token);
//            username = claims.getSubject();
//        } catch (Exception e) {
//            username = null;
//        }
//        return username;
//    }
//
//    public static Date getCreatedDateFromToken(String token) {
//        Date created;
//        try {
//            final Claims claims = getClaimsFromToken(token);
//            created = new Date((Long) claims.get(CLAIM_KEY_CREATED));
//        } catch (Exception e) {
//            created = null;
//        }
//        return created;
//    }
//
//    private static Claims getClaimsFromToken(String token) {
//        Claims claims;
//        try {
//            claims = Jwts.parser()
//                    .setSigningKey(CommonConstants.JWT_BASE64_SECRET)
//                    .parseClaimsJws(token)
//                    .getBody();
//        } catch (Exception e) {
//            claims = null;
//        }
//        return claims;
//    }
//
//    /***
//     * JwtToken的具体生成方法
//     * @param claims Token的内容
//     * @return java.lang.String
//     * @author yzy
//     * @date 2023/4/11 17:28
//     */
//    static String generateToken(Map<String, Object> claims) {
//        return Jwts.builder()
//                //设置声明信息（用户名等）
//                .setClaims(claims)
//                //设置过期时间
//                .setExpiration(generateExpirationDate())
//                //设置签名
//                .signWith(SignatureAlgorithm.HS512, CommonConstants.JWT_BASE64_SECRET)
//                .compact();
//    }
//
//    public static Date getExpirationDateFromToken(String token) {
//        Date expiration;
//        try {
//            final Claims claims = getClaimsFromToken(token);
//            //得到token的有效期
//            expiration = claims.getExpiration();
//        } catch (Exception e) {
//            expiration = null;
//        }
//        return expiration;
//    }
//
//    /***
//     *  设置token的过期时间
//     * @return java.util.Date
//     * @author yzy
//     * @date 2023/4/11 17:30
//     */
//    private static Date generateExpirationDate() {
//        return new Date(System.currentTimeMillis() + CommonConstants.JWT_TOKEN_EXPIRE_SECONDS);
//    }
//
//    private static Boolean isTokenExpired(String token) {
//        final Date expiration = getExpirationDateFromToken(token);
//        return expiration.before(new Date());
//    }
//
//    /**
//     * 验证当前的token是否有效
//     * @author yzy
//     * @date 2023/4/11 17:31
//     */
//    public static Boolean validateToken(String token, UserDetails userDetails) {
//        SecurityUser user = (SecurityUser) userDetails;
//        final String username = getUsernameFromToken(token);
//        return (username.equals(user.getUsername())&& !isTokenExpired(token));
//    }
//
//    public String getAudienceFromToken(String token) {
//        String audience;
//        try {
//            final Claims claims = getClaimsFromToken(token);
//            audience = (String) claims.get(CLAIM_KEY_AUDIENCE);
//        } catch (Exception e) {
//            audience = null;
//        }
//        return audience;
//    }
//
//    private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
//        return (lastPasswordReset != null && created.before(lastPasswordReset));
//    }
//
//    private Boolean ignoreTokenExpiration(String token) {
//        String audience = getAudienceFromToken(token);
//        return (AUDIENCE_TABLET.equals(audience) || AUDIENCE_MOBILE.equals(audience));
//    }
//
//    public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset) {
//        final Date created = getCreatedDateFromToken(token);
//        return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset)
//                && (!isTokenExpired(token) || ignoreTokenExpiration(token));
//    }
//
//    public String refreshToken(String token) {
//        String refreshedToken;
//        try {
//            final Claims claims = getClaimsFromToken(token);
//            claims.put(CLAIM_KEY_CREATED, new Date());
//            refreshedToken = generateToken(claims);
//        } catch (Exception e) {
//            refreshedToken = null;
//        }
//        return refreshedToken;
//    }
//}
